【文末有惊喜!】DLNA技术初探
本文字数:3489字
预计阅读时间:13分钟
DLNA的全称是DIGITAL LIVING NETWORK ALLIANCE(数字生活网络联盟), 其宗旨是Enjoy your music, photos and videos, anywhere anytime, DLNA(Digital Living Network Alliance) 由索尼、英特尔、微软等发起成立、旨在解决个人电脑,消费电器,移动设备在内的无线网络和有线网络的互联互通,使得数字媒体和内容服务的无限制的共享和增长成为可能,成员公司已达280多家。
DLNA不是一种协议,而是一种解决的方案,一种大家可以遵守的规范。其包括了实现相关标准所需要的一系列协议栈。如HTTPS、SDP、XML、SOAP、UPnP、UDP、TCP/IP等等。DLNA不仅可用于WIFI,还支持Bluetooth等多种通信协议。
01
DLNA架构
1、NetWorking Connectivity 网络互联方式:包括物理连接的标准,有有线的,比如符合IEEE802.3标准的Ethernet;有无线的,比如符合IEEE802.11a/g标准的WiFi等。
2、NetWorking Stack 网络协议栈:DLNA 的网络协议包括 IPv4 和 IPv6,目前对IPv4的支持的比较好,IPv6后续也会支持起来的。
3、Device Discovery&Control 设备的发现跟控制是DLNA的基础协议框架层,是DLNA非常重要的一层。DLNA用UPnP协议来实现设备的发现和控制。
4、Media Management 媒体管理包括媒体内容的识别、管理和分发。UPnP Audio/Video (AV) 技术用来解决 DLNA 设备的多媒体管理。
5、Remote UI 远程用户接口主要定义了网络设备之间的UI 内容是如何被描述,格式化及传输的,也包括不同设备之间的事件发送机制及UI 更新机制。
6、Media Transport 媒体传输:这一层用HTTP( HyperText Transfer Protocol )超文本传输协议。就是平时我们上网用的媒体传输协议。HTTP 用 TCP 可靠传输,也有混合UDP 方式的 HTTP。
7、Media Formats 媒体格式:图片,音频,视频
02
DLNA的功能
DLNA拥有如下功能:
1.探索:网络中寻找无配置的设备并计算出其提供的性能
2.浏览:浏览内容并通过不同方式分类
3.搜索:在设备上寻找特定内容
4.分流:全网发送多媒体内容
5.服务:网络通知通讯录
6.打印:向网络附属打印机发送内容
7.控制:使用网络改变设备状态
8.上传:发送内容到服务器
9.下载:接收并储存内容
10.自动译码:改变分辨率或内容格式来确保设备正确翻译
11.服务保证:区分网络交通优先次序,若网络超载,优先放弃最弱的优先权
12.目前为止DLNA能够识别最大文件数为8000个。
对于客户端来说,我们只用来将客户端的播放地址投放给智能电视盒子。客户端也可以控制智能电视盒子基本播放功能(调节音量,拖动进度,暂停和播放等)。
03
实现DLNA需要了解的内容
首先简单介绍一下手机端和智能设备在DLNA标准定义中的定位。手机端将网络视频投放到智能电视时,手机端作为控制点(Control Point),智能电视作为播放设备。要实现从移动端将网络视频投放至智能电视或机顶盒,首先要保证这些设备在同一个局域网的相同网段下,即共享同一个网关(Internet Gateway)。这样所有设备都能够拥有独立的IP,从而具备相互通信的基础了。
DLNA与UPnP之间的关系 DLNA协议是建立在UPnP协议的基础上的,它依靠UPnP协议来完成设备的搜索、发现和控制,DLNA协议在此基础上对多媒体设备进行了更加详细的分类和约束,它其实更像是UPnP协议的一个子集。相比于UPnP协议,它更加专注于解决多媒体内容的共享的架构。
ST:设备类型对应有如下几种
ssdp:all //所有支持DLNA的智能设备
upnp:rootdevice //智能电视、机顶盒、路由器、支持DLNA的电脑设备等
urn:schemas-upnp-org:device:MediaRenderer:1 //可渲染设备
urn:schemas-upnp-org:device:MediaServer:1 //DLNA服务器
urn:schemas-upnp-org:device:InternetGatewayDevice:1 //网关设备
实现DLNA前需要了解的协议有UPnP、SSDP、XML、SOAP、HTTP、UDP、TCP/IP。这里只对UPnP、SSDP和SOAP做下介绍。
UPnP
UPnP(Universal Plug and Play) 即通用即插即用,是由“通用即插即用论坛”(UPnP Forum)推广的一套网络协议。该协议的目标是使家庭网络(数据共享、通信和娱乐)和公司网络中的各种设备能够相互无缝连接,并简化相关网络的实现。UPnP通过定义和发布基于开放、因特网通讯网协议标准的UPnP设备控制协议来实现这一目标。
在 UPnP 网络中,服务、设备和控制点(Control Point,即 CP)是基本组件。UPnP网络中定义的设备具有很广泛的含义,各种各样的家电、电脑外设、智能设备、无线设备、个人电脑等等都可以成为其中一员。一个UPnP设备可以是多个服务的载体和多个子设备的嵌套集。而控制点CP 指的是可以发现并控制其它设备的设备。
SSDP
SSDP(Simple Service Discovery Protocol)简单服务发现协议是构成通用即插即用(UPnP)技术的核心协议之一。简单服务发现协议是在HTTPU和HTTPMU的基础上实现的协议。
SSDP有两种工作方式:
主动通知(Notify) 搜索-响应(HTTP扩展协议:M-SEARCH),分为多播搜索消息和单播搜索消息。
SOAP
UPnP 的设备控制是基于 SOAP 协议的,SOAP(Simple Object Access Protocol)即简单对象访问协议,是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。在 UPnP 中控制点会向设备的服务发出 Action,并接收结果或错误返回,该动作、结果和错误封装在SOAP中,通过HTTP 请求发送,并通过 HTTP 响应接收。
04
DLNA实现视频投放基本步骤如下
1、搜索设备
CP(Control Point以下均以这个称呼客户端)需要遵循SSDP向默认多播IP和端口发送获取信息的请求。对于CP使用搜索-响应方式来搜索设备即http的扩展协议M-SEARCH
。搜索请求消息的格式如下:
M-SEARCH * HTTP/1.1
MX:1 // 随机接收时间最大值
ST:upnp:rootdevice //搜索设备类型
MAN:ssdp:discover //默认搜索模式
Connection:close //连接状态 Keep-Alive:保持 close:不保持
Host:239.255.255.250 // 多播地址
User-Agent:iOS product/version
这个消息是由UDP端口发送的请求,请求成功会收到UDP端口的返回信息:
HTTP/1.1 200 OK
Location: http://192.168.31.8:1298/
Cache-Control: max-age=1800
Server: UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.11
EXT:
USN: uuid:74495474-dmr::urn:schemas-upnp-org:device:MediaRenderer:1
ST: urn:schemas-upnp-org:device:MediaRenderer:1
Date: Fri, 12 Jun 2020 06:54:24 GMT
因为通讯是基于UDP协议发送的,可能会导致丢包的问题,所以建议设备搜索的过程中多发起几次请求,减少错误的产生。此时,CP可以获得的有效信息是LOCATION
以及USN(UUID)
, 控制点仍然对设备知之甚少。所以这一步仅是发现同一局域网下的所有设备,下一步根据需要获取相应设备的DDD(Device Description Document:设备描述文档)。
2、获取DDD
该步骤是请求设备描述,设备有两种信息描述,设备描述以及服务描述,以下是对两种描述的具体解释。
设备描述
包括特定厂商、制造商信息,如模块名称和编号、序列号、制造商名称、特定厂商网站 URL 等。对于设备中的每种服务,描述包含服务类型、名称、服务描述URL、控制URL以及事件URL。设备描述还包括所有嵌入式设备描述及presentationURL.
服务描述
定义了 Action 及其参数,还有状态变量及其数据类型、取值范围和事件特征。每个服务必须包含 0 或多个Action,每个Action必须包含 0 或多个参数,每个参数要么是输入参数要么是输出参数,每个参数对应一个状态变量,每个服务有 1 或多个状态变量。
我们使用LOCATION
字段里对应的url去请求设备描述,这些信息都是以xml格式返回。这个请求是基于TCP的HTTP比UDP协议稳定可靠,故不需要多次请求处理容错。请求成功返回的消息如下:
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="urn:schemas-upnp-org:device-1-0" xmlns:dlna="urn:schemas-dlna-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
<friendlyName>............024285-DLNA</friendlyName>
<manufacturer>DLNA</manufacturer>
<manufacturerURL> </manufacturerURL>
<modelDescription>Media Renderer, DLNA(DMR)</modelDescription>
<modelName>Media Renderer</modelName>
<modelURL> </modelURL>
<modelNumber>1.0</modelNumber>
<serialNumber></serialNumber>
<UDN>uuid:74495474-dmr</UDN>
<presentationURL>http://192.168.31.8:8080/</presentationURL>
<dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50</dlna:X_DLNADOC>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
<serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
<SCPDURL>/AVTransport/74495474-dmr/scpd.xml</SCPDURL>
<controlURL>/AVTransport/74495474-dmr/control.xml</controlURL>
<eventSubURL>/AVTransport/74495474-dmr/event.xml</eventSubURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
<serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
<SCPDURL>/ConnectionManager/74495474-dmr/scpd.xml</SCPDURL>
<controlURL>/ConnectionManager/74495474-dmr/control.xml</controlURL>
<eventSubURL>/ConnectionManager/74495474-dmr/event.xml</eventSubURL>
</service>
<service>
<serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
<serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
<SCPDURL>/RenderingControl/74495474-dmr/scpd.xml</SCPDURL>
<controlURL>/RenderingControl/74495474-dmr/control.xml</controlURL>
<eventSubURL>/RenderingControl/74495474-dmr/event.xml</eventSubURL>
</service>
</serviceList>
</device>
</root>
通过这个xml格式的消息,我们可以得到详细的设备信息。serviceList
里面对应的信息都是比较重要的,表明了该设备可以提供的服务。有了设备信息,但是现在还不知道如何使用CP控制这些设备。所以接下来我们要请求下设备的SDD(Service Description Document: 服务描述文档)。
3、获取SDD
xml返回的消息里面SCPDURL这个字段的内容就是请求SDD的路径地址,我们将其与之前在SSDP发现设备阶段获取到的响应消息中的LOCATION
字段内容中设备的IP和端口号拿过来,拼接成完整URL字符串:
http://192.168.31.8:1298/AVTransport/74495474-dmr/scpd.xml
使用此url发送一个get请求即可得到SDD,返回格式如下:
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<actionList>
<action>
<name>SetAVTransportURI</name>
<argumentList>
<argument>
<name>InstanceID</name>
<direction>in</direction>
<relatedStateVariable>A_ARG_TYPE_InstanceID</relatedStateVariable>
</argument>
<argument>
<name> CurrentURI </name>
<direction>in</direction>
<relatedStateVariable> AVTransportURI </relatedStateVariable>
</argument>
<argument>
<name>CurrentURIMetaData</name>
<direction>in</direction>
<relatedStateVariable>AVTransportURIMetaData</relatedStateVariable>
</argument>
</argumentList>
</action>
……
</actionList>
<serviceStateTable>
<stateVariable sendEvents="no">
<name>CurrentPlayMode</name>
<dataType>string</dataType>
<defaultValue>NORMAL</defaultValue>
<allowedValueList>
<allowedValue>NORMAL</allowedValue>
<allowedValue>REPEAT_ONE</allowedValue>
<allowedValue>REPEAT_ALL</allowedValue>
<allowedValue>SHUFFLE</allowedValue>
<allowedValue>SHUFFLE_NOREPEAT</allowedValue>
</allowedValueList>
</stateVariable>
…
</serviceStateTable>
</scpd>
上面展示了部分服务描述信息,actionList
下面对应的是动作列表,如actionList下这个SetAVTransportURI
,这个请求的功能是将一个音视频资源的URI发送给渲染端。一个动作(Action)类似一个API请求,你还需要传递一些要求的参数,这时就会用到该Action后面argumentList里规定的一些Argument。比如根据第一个参数<name>CurrentURI</name>
,表示的就是你想发送的URI;同时<direction>in</direction>
表示的是这是一个传入参数,如果为out则表示该动作会返回给你这个参数的值。
4、请求服务
UPnP 的设备控制是基于 SOAP 协议的,SOAP(Simple Object Access Protocol)即简单对象访问协议,是交换数据的一种协议规范,是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计成在WEB上交换结构化的和固化的信息。在 UPnP 中控制点会向设备的服务发出 Action,并接收结果或错误返回,该动作、结果和错误封装在SOAP中,通过HTTP 请求发送,并通过 HTTP 响应接收。
根据DDD以及SDD我们可以知道请求服务需要的所有信息。可以按照DLNA规定的格式给设备发送请求服务,url是通过请求DDD返回消息里面的 <controlURL>/RenderingControl/74495474-dmr/control.xml</controlURL>
获取的,DLNA规定请求动作的格式如下:
POST /AVTransport/74495474-dmr/control.xml HTTP/1.1
HOST: 192.168.31.8:1298
Content-Type: text/xml; charset="utf-8"
SOAPAction: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
<CurrentURI>yourAVURI</CurrentURI>
</u:SetAVTransportURI>
</s:Body>
</s:Envelope>
IP是SSDP发现设备时的IP; 内容是SDD中serviceType与Action名字拼接而成; <u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">也是由serviceType和Action名字组合而成; 和 是action里面需要传入的参数
如果设备给CP返回200的消息,则代表此次请求服务成功。注意服务请求使用的是POST。
以上就是简单实现了由手机端控制智能电视的所有步骤。
05
总结
DLNA目前在项目里与设备的交互都是明文传输,没有办法预防投屏的播放地址被抓取。无法使用HTTPS等安全传输协议,除非能和需要适配的DLNA设备厂商进行合作协商。DLNA完整流程图如下:
DLNA 组织虽然在2017年1月15日正式解散 但是多屏推送技术还是很有用并且很实用。
THE END
本期赠书
《面向对象是怎样工作的(第2版)》畅销书是《程序是怎样跑起来的》、《网络是怎样连接的》同系列作品。本书以图配文的形式,直观易懂地详细介绍了面向对象的全貌及其中包含的各项技术,包括面向对象编程、框架、设计模式、UML、建模、面向对象设计和敏捷开发等。对于各项技术是如何使用的(How),书中只进行最小限度的说明,而重点介绍这些技术究竟是什么样的(What)以及为什么需要这些技术(Why)。另外,书中设有“编程往事”专栏,介绍了作者年轻时的一些经历;还设有“对象的另一面”专栏,以与正文不同的视角讲解面向对象这一概念普及的背景和原因,通俗有趣。
参与方式
方式一:文末留言板留言,点赞前3名各获赠书一本
方式二:转发本文至朋友圈,截图发至公众号后台,随机抽取2名获奖者赠书一本
特别提醒:方式一、二可同时参与(获奖几率更大~),活动有效期自发布日当天起七天内
获奖公布
公布时间及位置:9月24日头条推送文末特别提醒:兑奖截止至10月1日,请参与读者及时兑奖
也许你还想看
(▼点击文章标题或封面查看)
加入搜狐技术作者天团
千元稿费等你来!
戳这里!☛